package fr.afcepf.al22.projet1.dao.implementation;

import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate4.HibernateTemplate;
import org.springframework.transaction.annotation.Transactional;

import fr.afcepf.al22.projet1.dao.interfaces.IDaoUtilisateur;
import fr.afcepf.al22.projet1.entity.Utilisateur;

@Transactional
public class DaoUtilisateurImpl implements IDaoUtilisateur {
	private final Logger log = Logger.getLogger(this.getClass());
	private HibernateTemplate ht; 
	
	public void setSessionFactory(SessionFactory sf){
		ht = new HibernateTemplate(sf);
	}
	

	@Override
	public Utilisateur ajouterUtilisateur(Utilisateur utilisateur) {
		log.info("DAO Utilisateur : ajouter utilisateur");
		ht.save(utilisateur);
		log.info("DAO Utilisateur : ajout ok");
		return utilisateur;
	}

	@Override
	public Utilisateur modifierUtilisateur(Utilisateur utilisateur) {
		log.info("DAO Utilisateur : modifier utilisateur");
		ht.update(utilisateur);
		log.info("DAO Utilisateur : modification ok");
		return utilisateur;
	}

	@Override
	public boolean supprimerUtilisateur(Utilisateur utilisateur) {
		log.info("DAO Utilisateur : suppression utilisateur");
		ht.delete(utilisateur);
		log.info("DAO Utilisateur : suppression ok");
		return true;
	}

	@Override
	public Utilisateur getUtilisateurById(Integer id) {
		List<Utilisateur> liste;
		log.info("DAO Utilisateur : get utilisateur par id");
		liste = (List<Utilisateur>)ht.findByNamedParam("SELECT u FROM Utilisateur u WHERE u.idUtilisateur = :pId", "pId", id);
		Utilisateur retour = null;
		if(liste.size() == 1){
			retour = liste.get(0);
		}
		log.info("DAO Utilisateur : get ok");
		return retour;
	}

	@Override
	public Utilisateur getUtilisateurByMail(String mail) {
		List<Utilisateur> liste;
		log.info("DAO Utilisateur : get utilisateur par mail");
		liste = (List<Utilisateur>)ht.findByNamedParam("SELECT u FROM Utilisateur u WHERE u.mailUtilisateur = :pMail", "pMail", mail);
		Utilisateur retour = null;
		if(liste.size() == 1){
			retour = liste.get(0);
		}
		log.info("DAO Utilisateur : get ok");
		return retour;
	}

	@Override
	public Utilisateur getUtilisateurByMailMdp(String mail, String mdp) {
		List<Utilisateur> liste;
		String[] nomParam =  {"pMdp","pMail"};
		Object[] param = {mdp, mail};
		log.info("DAO Utilisateur : get utilisateur par mail et mdp");
		liste = (List<Utilisateur>)ht.findByNamedParam("SELECT u FROM Utilisateur u WHERE u.mdpUtilisateur = :pMdp AND u.mailUtilisateur = : pMail", nomParam, param);
		
		Utilisateur retour = null;
		if(liste.size() == 1){
			retour = liste.get(0);
		}
		log.info("DAO Utilisateur : get ok");
		return retour;
	}

	@Override
	public List<Utilisateur> getAllUtilisateurs() {
		List<Utilisateur> liste;
		log.info("DAO Utilisateur : get all utilisateur");
		liste = (List<Utilisateur>)ht.find("SELECT u FROM Utilisateur u");
		log.info("DAO Utilisateur : get ok");
		return liste;
	}

}
